package cn.ike.service.system.impl;

import cn.ike.dao.system.ModuleDao;
import cn.ike.dao.system.RoleDao;
import cn.ike.dao.system.UserDao;
import cn.ike.domain.system.Module;
import cn.ike.domain.system.User;
import cn.ike.service.system.ModuleService;
import cn.ike.utils.JedisUtils;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import redis.clients.jedis.Jedis;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

@Service
public class ModuleServiceImpl implements ModuleService {

    // 注入ModuleDao
    @Autowired
    private ModuleDao moduleDao;

    // 注入UserDao
    @Autowired
    private UserDao userDao;

    @Autowired
    private RoleDao roleDao;


    /**
     * 查询全部模块
     */
    @Override
    public List<Module> findAll() {
        List<Module> moduleList = null;
        Jedis jedis = null;
        try {
            // 从redis中获取所有权限
            ObjectMapper mapper = new ObjectMapper();
            jedis = JedisUtils.getJedis();
            String allModules = jedis.get("allModules");
            if (allModules != null) {
                JSONArray objects = JSONArray.parseArray(allModules);
                moduleList = objects.toJavaList(Module.class);
            } else {
                try {
                    moduleList = moduleDao.findAll();
                    String moduleStr = mapper.writeValueAsString(moduleList);
                    jedis.set("allModules", moduleStr);
                } catch (JsonProcessingException e) {
                    e.printStackTrace();
                }
            }
        } catch (Exception e){
            e.printStackTrace();
        } finally {
            if(jedis != null){
                jedis.close();
            }
        }
        return moduleList;
    }

    /**
     * 分页查询模块
     * @param pageNum
     * @param pageSize
     */
    @Override
    public PageInfo<Module> findByPage(int pageNum, int pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        List<Module> moduleList = moduleDao.findAll();
        return new PageInfo<>(moduleList);
    }

    /**
     * 根据id查询模块
     * @param moduleId
     */
    @Override
    public Module findById(String moduleId) {
        return moduleDao.findById(moduleId);
    }

    /**
     * 添加模块
     * @param module
     */
    @Override
    public void save(Module module) {
        Jedis jedis = JedisUtils.getJedis();
        jedis.del("allModules");
        jedis.close();
        module.setId(UUID.randomUUID().toString());
        moduleDao.save(module);
    }

    /**
     * 修改模块
     * @param module
     */
    @Override
    public void update(Module module) {
        Jedis jedis = JedisUtils.getJedis();
        jedis.del("allModules");
        jedis.close();
        moduleDao.update(module);
    }

    /**
     * 删除模块
     * @param moduleId
     */
    @Override
    public boolean delete(String moduleId) {
        Long byModuleId = moduleDao.findByModuleId(moduleId);
        if (byModuleId == 0) {
            moduleDao.delete(moduleId);
            Jedis jedis = JedisUtils.getJedis();
            jedis.del("allModules");
            jedis.close();
            return true;
        }
        return false;
    }

    /**
     * 查询角色所拥有的权限
     * @param roleId
     * @return
     */
    @Override
    public List<Module> findModulByRoleId(String roleId) {
        List<Module> modulByRoleId = null;
        ObjectMapper mapper = new ObjectMapper();
        Jedis jedis = JedisUtils.getJedis();
        String mStr = jedis.get(roleId);
        if (mStr != null){
            JSONArray objects = JSONObject.parseArray(mStr);
            modulByRoleId = objects.toJavaList(Module.class);
        } else {
            modulByRoleId = moduleDao.findModulByRoleId(roleId);
            try {
                mStr = mapper.writeValueAsString(modulByRoleId);
                jedis.set(roleId, mStr);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }
        jedis.close();
        return modulByRoleId;
    }

    /**
     * 角色分配权限
     * @param roleId
     * @param moduleIds
     */
    @Override
    public void updateRoleModule(String roleId, String moduleIds) {
        //-- 需求：角色分配权限
        //-- 1. 解除角色权限关系
        //DELETE FROM pe_role_module WHERE role_id=?
        moduleDao.deleteRoleModuleByRoleId(roleId);
        ObjectMapper mapper = new ObjectMapper();
        Jedis jedis = JedisUtils.getJedis();
        jedis.del(roleId);

        //-- 2. 给角色添加权限
        //INSERT INTO pe_role_module(role_id,module_id)VALUES(?,?)
        List<Module> modulRole = new ArrayList<>();
        String mStr = "";
        if (!StringUtils.isEmpty(moduleIds)) {
            String[] array = moduleIds.split(",");
            if (array != null && array.length > 0) {
                for (String moduleId : array) {
                    Module module = moduleDao.findById(moduleId);
                    modulRole.add(module);
                    moduleDao.updateRoleModule(roleId, moduleId);
                }
            }
            try {
                mStr = mapper.writeValueAsString(modulRole);
                jedis.set(roleId, mStr);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }
        jedis.close();
    }

    /**
     * 根据用户id查询模块
     * @param userId
     * @return
     */
    @Override
    public List<Module> findModuleByUserId(String userId) {
        // 根据用户id查询用户信息
        User user = userDao.findById(userId);
        // 获取用户的等级
        Integer degree = user.getDegree();
        // 判断用的等级
        if (degree == 0) {
            // 表示该用户是SaaS管理员, 只显示saas管理模块
            //SELECT * FROM ss_module WHERE belong=0
            return moduleDao.findByBelong(0);
        } else if (degree == 1) {
            // 表示该用户是企业管理员, 显示除了saas管理模块之外的所有模块
            //SELECT * FROM ss_module WHERE belong=0
            return moduleDao.findByBelong(1);
        } else {
            //登陆用户的degree是其他，就根据用户id查询权限
            return moduleDao.findModuleByUserId(userId);
        }
    }
}
